home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 4
/
Aminet 4 - November 1994.iso
/
aminet
/
comm
/
net
/
dnet_src.lha
/
dnet
/
amiga
/
lib
/
dnread.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-11-05
|
2KB
|
100 lines
/*
* DNRead.C
*/
#include "lib.h"
long
DNRead(_chan, _buf, bytes)
void *_chan;
void *_buf;
long bytes;
{
CHANN *chan = (CHANN *)_chan;
char *buf = (char *)_buf;
IOSTD *ior;
int len = 0;
long n;
if (chan->eof)
return(-1);
while (bytes && ((ior = (IOSTD *)RemHead(&chan->rdylist)) || (ior = (IOSTD *)GetMsg(&chan->port)))) {
#ifdef DEBUG
printf("IOR %08lx cmd %d len %d act %d\n", ior, ior->io_Command, ior->io_Length, ior->io_Actual);
#endif
if (ior->io_Message.mn_Node.ln_Type == NT_REPLYMSG) {
if (!chan->queued)
#ifdef DEBUG
puts("DNRead: Software Error");
#else
;
#endif
else
--chan->queued;
if (ior->io_Length)
FreeMem(ior->io_Data, ior->io_Length);
FreeMem(ior, sizeof(IOSTD));
continue;
}
switch(ior->io_Command) {
case DNCMD_CLOSE:
case DNCMD_EOF:
chan->eof = 1;
ReplyMsg((MSG *)ior);
break;
case DNCMD_IOCTL:
if (ior->io_Message.mn_Node.ln_Type == NT_REQUEUE)
AddHead(&chan->rdylist, (NODE *)ior);
else
AddTail(&chan->rdylist, (NODE *)ior);
ior->io_Message.mn_Node.ln_Type = NT_REQUEUE;
if (len == 0)
len = -2;
goto done;
case DNCMD_WRITE:
#ifdef DEBUG
printf("IOR LEN/ACT %ld/%ld\n", ior->io_Length, ior->io_Actual);
#endif
n = ior->io_Length - ior->io_Actual;
#ifdef DEBUG
if (n < 0)
puts("len fail");
#endif
if (n <= bytes) {
BMov((char *)ior->io_Data + ior->io_Actual, buf, n);
bytes -= n;
len += n;
buf += n;
ReplyMsg((MSG *)ior);
} else {
BMov((char *)ior->io_Data + ior->io_Actual, buf, bytes);
len += bytes;
ior->io_Actual += bytes;
bytes = 0;
if (ior->io_Message.mn_Node.ln_Type == NT_REQUEUE)
AddHead(&chan->rdylist, (NODE *)ior);
else
AddTail(&chan->rdylist, (NODE *)ior);
ior->io_Message.mn_Node.ln_Type = NT_REQUEUE;
}
break;
default:
ior->io_Error = 1;
ReplyMsg((MSG *)ior);
}
}
#ifdef DEBUG
puts("DONE1");
#endif
done:
FixSignal(chan);
if (chan->eof)
SetSignal(1 << chan->port.mp_SigBit, 1 << chan->port.mp_SigBit);
#ifdef DEBUG
printf("RETURN %ld\n", len);
#endif
return(len);
}